51单片机探索:串口通信、WiFi、蓝牙和4G模块 |
您所在的位置:网站首页 › 4g模块 打电话 › 51单片机探索:串口通信、WiFi、蓝牙和4G模块 |
目录 串口通信 全双工通信(打电话) TTL电平 UART 字节帧 串口相关的寄存器 串口的工作模式 蓝牙模块HC-08 HC-08的AT指令编辑 WiFi模块ESP8266 配置WiFi模块作为客户端连入当前局域网 配置WiFi模块作为服务器 编辑 4G模块EC03-DNC4 配置4G模块 串口通信串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方 式的扩展接口。串行接口(Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简 单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成 本,特别适用于远距离通信,但传送速度较慢 设备之间的一种通信的方式(数据交互) 数据只能一位一位的进行传输 全双工通信 数据传输速度较慢 全双工通信(打电话)通信允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合。全双工指可以同时(瞬时)进行信号的双向传输(A→B且B→A)。指A→B的同时B→A,是瞬时同步的。通信允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合。全双工指可以同时(瞬时)进行信号的双向传输(A→B且B→A)。指A→B的同时B→A,是瞬时同步的。 TTL电平TTL是Transistor-Transistor Logic,即晶体管-晶体管逻辑的简称,它是计算机处理器控制的设备 内部各部分之间通信的标准技术。TTL电平信号应用广泛,是因为其数据表示采用二进制规定, +5V等价于逻辑”1”,0V等价于逻辑”0”。 UART 通用异步收发器(UART)也是一种串口通信协议,通过异步来发送/接收数据,USB转TTL就是使用UART的一种模块。 工作原理是将传输数据的每个二进制位一位接一位地传输。在UART通信协议中信号线上的状态为高电平时代表‘1’,信号线上的状态为低电平时代表‘0’。比如使用UART通信协议进行一个字节数据的传输时就是在信号线上产生八个高低电平的组合。 两个UART设备之间通信的时候不需要时钟线,这时候就需要在两个UART设备上指定相同的传输速率(波特率),以及数据格式(起始位、数据位、奇偶检验位、停止位),也就是遵循相同的协议。 字节帧字符帧也叫数据帧,一帧数据由起始位、数据位、奇偶校验位和停止位组成,对于异步通信,要能够进行数据的正确传送,通信双方必须先约定好传送数据的速率和传送数据的组织格式,即波特率和字符帧的格式。 ![]() 总之,使用UART串口协议传输数据时,需要规定双方的传输速率(波特率)一致,数据格式(起始位,数据位,奇偶校验为、停止位)也要保持一致。例如传递字符a时,字符a的一帧信息由起始位、数据位(字符a)、奇偶校验位(可选)、停止位组成。 串口相关的寄存器串口数据缓冲寄存器(SUBF寄存器): SUBF寄存器有两个缓冲器,分别是只读寄存器和只写寄存器,写SBUF操作完待发送数据的加载,读SBUF操作获得已接收到的数据 想要从SUBF寄存器读取数据时:char data = SBUF; 想要向SUBF寄存器的写入数据时:SBUF = data;电源控制寄存器PCON ![]() 串行控制寄存器SCON ![]() ![]() ![]() ![]() IE寄存器 IP寄存器、IPH寄存器 工作模式1: ![]() 工作模式2: ![]() 工作模式3: ![]() PC机串口调试助手(STC-ISP)发送字符o时让51单片机的蜂鸣器叫,发送字符c时让51单片机的蜂鸣器停止叫。 #include "reg52.h" #include sfr AUXR = 0x8E; sbit buzzer = P1^2; char cmd; void Delay1000ms() //@11.0592MHz { unsigned char i, j, k; _nop_(); i = 8; j = 1; k = 243; do { do { while (--k); } while (--j); } while (--i); } void uartInit() { AUXR = 0x01; PCON &= 0x7F; //配置波特率正常 SCON = 0x50; //配置串口选择工作方式1,允许串口接收数据 //配置定时器1为8位自动重装模式 TMOD &= 0x0F; TMOD |= 0x20; //给定时器1,9600波特率初值 TH1 = 0xFD; //定时器1初值 TL1 = 0xFD; //定时器1重装值 ET1 = 0; //不允许定时器1产生中断 TR1 = 1; //开启定时器1 EA = 1; //开启总中断 ES = 1; //开启串口中断 } void sendByte(char mydata) { SBUF = mydata; //向串口发送一帧信息 while(!TI); //等待硬件置位 TI = 0; //TI软件清0 } void sendString(char *str) { while(*str != '\0'){ sendByte(*str); str++; } } void main() { buzzer = 1; uartInit(); while(1){ sendString("jiangxiaoya\r\n"); //发送心跳包,确保串口通信没有中断 Delay1000ms(); } } void myUart() interrupt 4 { //接收数据后,RI硬件置位产生的中断 if(RI){ RI = 0; //RI软件清0 cmd = SBUF; //获取从pc端接收到的数据 if(cmd == 'o'){ buzzer = 0; } if(cmd == 'c'){ buzzer = 1; } } //接收数据后,TI硬件置位产生的中断 if(TI); }PC机串口调试助手(STC-ISP)发送字符串open时让51单片机的蜂鸣器叫,发送字符串close时让51单片机的蜂鸣器停止叫。 #include "reg52.h" #include sfr AUXR = 0x8E; sbit buzzer = P1^2; char cmd[12] ; void Delay1000ms() //@11.0592MHz { unsigned char i, j, k; _nop_(); i = 8; j = 1; k = 243; do { do { while (--k); } while (--j); } while (--i); } void uartInit() { AUXR = 0x01; PCON &= 0x7F; //配置波特率正常 SCON = 0x50; //配置串口选择工作方式1,允许串口接收数据 //配置定时器1为8位自动重装模式 TMOD &= 0x0F; TMOD |= 0x20; //给定时器1,9600波特率初值 TH1 = 0xFD; //定时器1初值 TL1 = 0xFD; //定时器1重装值 ET1 = 0; //不允许定时器1产生中断 TR1 = 1; //开启定时器1 EA = 1; //开启总中断 ES = 1; //开启串口中断 } void sendByte(char mydata) { SBUF = mydata; //向串口发送一帧信息 while(!TI); //等待硬件置位 TI = 0; //TI软件清0 } void sendString(char *str) { while(*str != '\0'){ sendByte(*str); str++; } } void main() { buzzer = 1; uartInit(); while(1){ sendString("jiangxiaoya\r\n"); //发送心跳包,确保串口通信没有中断 Delay1000ms(); } } void myUart() interrupt 4 { static int i = 0; //接收数据后,RI硬件置位产生的中断 if(RI){ RI = 0; //RI软件清0 //获取从pc端接收到的数据 cmd[i] = SBUF; i++; if(i == 12){ i = 0; } //strstr():字符串包含函数,不包含返回NULL if(strstr(cmd,"en") != NULL){ buzzer = 0; i = 0; memset(cmd,'\0',12); } if(strstr(cmd,"os") != NULL){ buzzer = 1; i = 0; memset(cmd,'\0',12); } } //接收数据后,TI硬件置位产生的中断 if(TI); } 蓝牙模块HC-08HC-08模块直接接线使用即可,可以使用STC-ISP软件发送AT指令:AT+NAME=名字,来修改蓝牙名字,跟STC-ISP里的串口助手使用方法一样。 ![]() wifi模块通过usb转ttl接入pc端,通过安信可串口调试助手修改esp8266的波特率,让它跟单片机的通信速度保持一致。 连接后发送AT指令修改esp8266波特率: AT+RST ,重启esp8266 AT ,检测esp8266的通信功能是否正常 AT+UART=9600,8,1,0,0 ,修改波特率esp8266的上网模式: ![]() 上述AT指令对应的响应 用51单片机使用esp8266作为客户端连入服务器 #include "reg52.h" #include #include sfr AUXR = 0x8E; sbit buzzer = P1^2; char mybuf[24]; //相关AT指令 char RESET[] = "AT+RST\r\n"; //重启esp8266 code char LJWL[] = "AT+CWJAP=\"haozige\",\"123456789000\"\r\n"; //连接WiFi code char LJFWQ[] = "AT+CIPSTART=\"TCP\",\"192.168.97.198\",8880\r\n"; //连接TCP服务器 char TCMS[] = "AT+CIPMODE=1\r\n"; //开启透传模式 char SJCS[] = "AT+CIPSEND\r\n"; //开启数据传输 int AT_OK_flag = 0; int AT_CONNECT_NET_flag = 0; void Delay500ms() //@11.0592MHz { unsigned char i, j, k; _nop_(); i = 4; j = 129; k = 119; do { do { while (--k); } while (--j); } while (--i); } void Delay1000ms() //@11.0592MHz { unsigned char i, j, k; _nop_(); i = 8; j = 1; k = 243; do { do { while (--k); } while (--j); } while (--i); } void Delay5000ms() //@11.0592MHz { unsigned char i, j, k; _nop_(); i = 36; j = 5; k = 211; do { do { while (--k); } while (--j); } while (--i); } void uartInit() { AUXR = 0x01; PCON &= 0x7F; //配置波特率正常 SCON = 0x50; //配置串口选择工作方式1,允许串口接收数据 //配置定时器1为8位自动重装模式 TMOD &= 0x0F; TMOD |= 0x20; //给定时器1,9600波特率初值 TH1 = 0xFD; //定时器1初值 TL1 = 0xFD; //定时器1重装值 ET1 = 0; //不允许定时器1产生中断 TR1 = 1; //开启定时器1 EA = 1; //开启总中断 ES = 1; //开启串口中断 } void sendByte(char mydata) { SBUF = mydata; //向串口发送一帧信息 while(!TI); //等待硬件置位 TI = 0; //TI软件清0 } void sendString(char *str) { while(*str != '\0'){ sendByte(*str); str++; } } void main() { int mark = 0; buzzer = 1; uartInit(); Delay5000ms(); //等待esp8266上电 sendString(LJWL); while(!AT_CONNECT_NET_flag); //等待WiFi连接成功 //while(!AT_OK); AT_OK_flag = 0; sendString(LJFWQ); while(!AT_OK_flag); //等待esp8266连接TCP服务器 AT_OK_flag = 0; sendString(TCMS); while(!AT_OK_flag); //等待esp8266开启透传模式 AT_OK_flag = 0; sendString(SJCS); while(!AT_OK_flag); //等待esp8266与tcp开启数据传输 while(1){ sendString("jiangxiaoya\r\n"); //发送心跳包,确保串口通信没有中断 Delay1000ms(); } } void myUart() interrupt 4 { static int i = 0; char tmp; //接收数据后,RI硬件置位产生的中断 if(RI){ RI = 0; //RI软件清0 //获取从pc端接收到的数据 tmp = SBUF; if(tmp == 'W' || tmp == 'O' || tmp == 'L' || tmp == 'F'){ i = 0; } mybuf[i] = tmp; i++; //连接wifi成功后,esp8266会返回WIFI GT IP if(mybuf[0] == 'W' && mybuf[1] == 'I'){ AT_CONNECT_NET_flag = 1; memset(mybuf,'\0',24); } //esp8266连接TCP服务器或者其他AT指令,esp8266会返回OK if(mybuf[0] == 'O' && mybuf[1] == 'K'){ AT_OK_flag = 1; memset(mybuf,'\0',24); } //TCP服务器发送数据给esp8266的灯控指令 //开 if(mybuf[0] == "L" && mybuf[1] == "1"){ buzzer = 0; memset(mybuf,'\0',24); } //关 if(mybuf[0] == "L" && mybuf[1] == "2"){ buzzer = 1; memset(mybuf,'\0',24); } //WiFi连接失败后,会返回FALL if(mybuf[0] == 'F' && mybuf[1] == 'A'){ for(i=0;i |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |